/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.handler;

import java.sql.SQLException;
import java.util.LinkedList;
import model.dao.LocalDAO;
import model.dto.LocalDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class LocalHandler {

    LocalDAO localDAO;

    public LocalHandler() throws SQLException, ClassNotFoundException {
        localDAO = new LocalDAO();
    }

    private void verificaCamposNotNullInsercao(LocalDTO localDTO) throws NotNullFieldsException {
        if (localDTO.getEndereco() == null) {
            throw new NotNullFieldsException("O campo Endereço é obrigatório");
        }

        if (localDTO.getCidade() == null) {
            throw new NotNullFieldsException("O campo Cidade é obrigatório");
        }

        if (localDTO.getEstado() == null) {
            throw new NotNullFieldsException("O campo Estado é obrigatório");
        }
    }

    private void verificaCamposNotNullAtualizacao(LocalDTO localDTO,
                                                  boolean atualizaEndereco,
                                                  boolean atualizaCidade,
                                                  boolean atualizaEstado) throws NotNullFieldsException {
        if ((localDTO.getEndereco() == null) && atualizaEndereco) {
            throw new NotNullFieldsException("O campo Endereço é obrigatório");
        }

        if ((localDTO.getCidade() == null) && atualizaCidade) {
            throw new NotNullFieldsException("O campo Cidade é obrigatório");
        }

        if ((localDTO.getEstado() == null) && atualizaEstado) {
            throw new NotNullFieldsException("O campo Estado é obrigatório");
        }
    }

    public LinkedList<LocalDTO> getTodosLocais() throws SQLException {
        return localDAO.getTodosLocais();
    }

    public LinkedList<LocalDTO> pesquisaLocal(Integer id, 
                                              String endereco,
                                              String bairro,
                                              String cidade,
                                              String estado) throws SQLException {
        return localDAO.pesquisaLocal(id, endereco, bairro, cidade, estado);
    }

    public void cadastraLocal(LocalDTO localDTO) throws NotNullFieldsException, SQLException {
        verificaCamposNotNullInsercao(localDTO);
        localDAO.insereLocal(localDTO);
    }

    public void atuaLizaLocal(LocalDTO localDTO,
            boolean atualizaEstado,
            boolean atualizaCidade,
            boolean atualizaBairro,
            boolean atualizaEndereco) throws NotNullFieldsException, NoChangesOnUpdateException, MissingIdException, SQLException {
        
        // Verifica se o identificador foi passado
        if (localDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(localDTO, atualizaEndereco, atualizaCidade, atualizaEstado);

        if (!(atualizaEstado || atualizaCidade || atualizaBairro || atualizaEndereco)) {
            throw new NoChangesOnUpdateException();
        }

        localDAO.atuaLizaLocal(localDTO, atualizaEstado, atualizaCidade, atualizaBairro, atualizaEndereco);
    }
}
